L’objectif de ce TP est d’apprendre à manipuler les séries temporelles sous R en utilisant les packages de bases. Dans R il existe de nombreux packages qui permettent de manipuler les séries temporelles. Pour n’en citer que quelques-uns :
- Les objets ts peuvent être créés à partir du package stats ;
- Les objets zoo peuvent être créés à partir du package zoo ;
- Les objets xts peuvent être créés à partir du package xts ;
- Les objets tis peuvent être créés à partir du package tseries ;
- Les objets tsibble peuvent être créés à partir du package tsibble.

tsbox permet quand à lui de facilement passer d’une classe à l’autre.

Ici nous nous concentrerons essentiellement sur les trois premiers : ts stocker les séries temporelles, zoo et xts pour effectuer certaines manipulations supplémentaires.

Manipulation des séries temporelles avec ts()

Création d’une série temporelle

La fonction ts() permet de créer des objets séries-temporelles à partir un vecteur (ou une matrice). La syntaxe de base est ts(vector, start=, end=, frequency=)start et end sont la première et la dernière observation, frequency est le nombre d’observations par unité de temps (1=annuelle, 2=semestrielle, 4=trimestrielle, 6=bi-mestrielle, 12=mensuelle, etc.).

Par exemple pour créer une série trimestrielle ayant les valeurs de 1 à 10 et commençant en 1959Q2 :

ts(1:10, frequency = 4, start = c(1959, 2)) # 2ème trimestre de 1959
##      Qtr1 Qtr2 Qtr3 Qtr4
## 1959         1    2    3
## 1960    4    5    6    7
## 1961    8    9   10
# Équivalent à 
ts(1:10, frequency = 4, start = 1959 + 1/4)
##      Qtr1 Qtr2 Qtr3 Qtr4
## 1959         1    2    3
## 1960    4    5    6    7
## 1961    8    9   10

On peut aussi définir l’objet à partir de sa date de fin :

ts(1:10, frequency = 4, end = c(1959, 2))
##      Qtr1 Qtr2 Qtr3 Qtr4
## 1957    1    2    3    4
## 1958    5    6    7    8
## 1959    9   10

Si l’on directement extraire un sous-ensemble de la série on peut spécifier les paramètres end et start. Par exemple pour ne garder que les valeurs jusqu’en 1960 inclus :

ts(1:10, frequency = 4, start = c(1959, 2), end = c(1960, 4))
##      Qtr1 Qtr2 Qtr3 Qtr4
## 1959         1    2    3
## 1960    4    5    6    7

Ou alors utiliser la fonction window une fois l’objet créé :

ts_object <- ts(1:10, frequency = 4, start = c(1959, 2))
window(ts_object, end = c(1960, 4))
##      Qtr1 Qtr2 Qtr3 Qtr4
## 1959         1    2    3
## 1960    4    5    6    7

On peut récupérer les différents attributs avec les fonctions start(), end() et frequency() :

start(ts_object)
## [1] 1959    2
end(ts_object)
## [1] 1961    3
frequency(ts_object)
## [1] 4

Deux autres fonctions peuvent aussi être utiles : time() crée un série-temporelle à partir des dates de notre série-temporelle et cycle() donne la position dans le cycle de chaque observation.

time(ts_object)
##         Qtr1    Qtr2    Qtr3    Qtr4
## 1959         1959.25 1959.50 1959.75
## 1960 1960.00 1960.25 1960.50 1960.75
## 1961 1961.00 1961.25 1961.50
cycle(ts_object)
##      Qtr1 Qtr2 Qtr3 Qtr4
## 1959         2    3    4
## 1960    1    2    3    4
## 1961    1    2    3

Exercice

Extraire toutes les données du 2ème trimestre de l’objet ts_object
ts_object[cycle(ts_object) == 2]
## [1] 1 5 9

Exercice

Créer une série temporelle mensuelle qui commence en 2000, qui se termine en janvier 2020, qui vaut 1 en avril 2009 et 0 à toutes les autres dates
indicatrice <- ts(0, start = 2000, end = 2020, frequency = 12)
window(indicatrice, start = c(2005, 4), end = c(2005, 4)) <- 1
indicatrice
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2000   0   0   0   0   0   0   0   0   0   0   0   0
## 2001   0   0   0   0   0   0   0   0   0   0   0   0
## 2002   0   0   0   0   0   0   0   0   0   0   0   0
## 2003   0   0   0   0   0   0   0   0   0   0   0   0
## 2004   0   0   0   0   0   0   0   0   0   0   0   0
## 2005   0   0   0   1   0   0   0   0   0   0   0   0
## 2006   0   0   0   0   0   0   0   0   0   0   0   0
## 2007   0   0   0   0   0   0   0   0   0   0   0   0
## 2008   0   0   0   0   0   0   0   0   0   0   0   0
## 2009   0   0   0   0   0   0   0   0   0   0   0   0
## 2010   0   0   0   0   0   0   0   0   0   0   0   0
## 2011   0   0   0   0   0   0   0   0   0   0   0   0
## 2012   0   0   0   0   0   0   0   0   0   0   0   0
## 2013   0   0   0   0   0   0   0   0   0   0   0   0
## 2014   0   0   0   0   0   0   0   0   0   0   0   0
## 2015   0   0   0   0   0   0   0   0   0   0   0   0
## 2016   0   0   0   0   0   0   0   0   0   0   0   0
## 2017   0   0   0   0   0   0   0   0   0   0   0   0
## 2018   0   0   0   0   0   0   0   0   0   0   0   0
## 2019   0   0   0   0   0   0   0   0   0   0   0   0
## 2020   0

Pour tracer un graphique il suffit maintenant d’utiliser les fonctions plot() et lines()

plot(ts_object * 2)
lines(ts_object, col = "red")

Séries multivariées

De la même façon que précédemment on peut créer une série temporelle multivariée. Cette fois-ci l’objet créé est à la fois mts, ts et matrix

mts <- ts(matrix(rnorm(300), 100, 3), start = c(1961, 1), frequency = 12)

On peut accéder à la première variable de la même façon que dans une matrice : par son nom ou son numéro de colonne :

colnames(mts)
## [1] "Series 1" "Series 2" "Series 3"
# mts[,1] # ou de façon équivalente :
mts[, "Series 1"]
##               Jan          Feb          Mar          Apr          May
## 1961  0.846216755 -1.480607810  0.712875544  0.565354193 -1.171130785
## 1962 -1.394459073 -0.360391859 -0.439644349  1.261949785  0.052608224
## 1963  1.444737944  0.715983526  0.400614751 -1.334375995 -1.314527761
## 1964 -0.722615626  0.535303147  0.336194368  0.013404389 -1.112654884
## 1965 -1.211981498  0.168554737 -1.785536453 -0.153429609 -0.657576879
## 1966 -1.384629768 -0.306981187 -3.440578343  0.749604759 -0.479126395
## 1967  1.702241167  1.188876814 -0.257592662  0.560098112  0.358571748
## 1968 -0.745072847  1.612171437 -0.741861282  1.839704095 -0.006827505
## 1969 -2.031490125 -0.680613282  0.189019916 -0.125269228             
##               Jun          Jul          Aug          Sep          Oct
## 1961  1.117809253 -1.578858855 -0.347795932  1.341049187  0.009753730
## 1962  0.793259359 -1.591047771 -1.095072922 -0.237697955 -0.628501284
## 1963 -1.887287954  2.813310391  0.055846272  1.132483282  1.761797069
## 1964  0.352232615 -0.361554650 -0.453462494  0.737519603 -1.250656949
## 1965 -0.584180061  0.101071186  1.013979664  0.568759249  0.452724609
## 1966 -0.188186599  1.381206748  0.854482504 -1.895478718 -1.591001643
## 1967 -3.531295876 -0.320459831 -1.782189099  1.072774142 -0.920641883
## 1968 -0.560599222  0.801547349  3.507490608  0.258134047 -1.013471687
## 1969                                                                 
##               Nov          Dec
## 1961  1.048714530  0.794888201
## 1962 -0.132312288 -0.359361054
## 1963  0.958649708 -0.406580504
## 1964 -0.973023495  0.518460208
## 1965  1.305444918 -1.485204878
## 1966  0.628010727 -0.432480412
## 1967  1.363721608 -0.395993531
## 1968 -0.122183387  0.087360459
## 1969

Et avec les même fonctions que pour les matrices on peut récupérer les noms des colonnes (colnames), le nombre de variables (ncol), etc.

Attention !

Une source classique d’erreur est de manipuler des séries-temporelles uni et multivariées et de vouloir utiliser les fonctions liées aux matrices sur les séries univariées. Par exemple, colnames(ts_object) renverra toujours l’objet NULL. Une solution est de tester si l’objet est multivarié avec la fonction is.mts().

Manipulation basiques

Pour concaténer plusieurs séries temporelles, les fonctions deux fonctions suivantes peuvent ts.union() et ts.intersect().

ts_object2 <- ts(1:10, frequency = 4, start = c(1960, 1))
ts.union(ts_object, ts_object2) # on garde toute la couverture temporelle en rajoutant des NA
##         ts_object ts_object2
## 1959 Q2         1         NA
## 1959 Q3         2         NA
## 1959 Q4         3         NA
## 1960 Q1         4          1
## 1960 Q2         5          2
## 1960 Q3         6          3
## 1960 Q4         7          4
## 1961 Q1         8          5
## 1961 Q2         9          6
## 1961 Q3        10          7
## 1961 Q4        NA          8
## 1962 Q1        NA          9
## 1962 Q2        NA         10
ts.intersect(ts_object, ts_object2) # on ne garde que les périodes communes
##         ts_object ts_object2
## 1960 Q1         4          1
## 1960 Q2         5          2
## 1960 Q3         6          3
## 1960 Q4         7          4
## 1961 Q1         8          5
## 1961 Q2         9          6
## 1961 Q3        10          7

On va maintenant utiliser la série d’indice de production industrielle de la France (CVS-CJO) :

ipi_fr_manuf <- ts(c(94.2, 96.69, 95.66, 95.06, 95.96, 93.97, 94.16, 93.4, 
94.12, 94.29, 92.42, 93.01, 94.98, 93.31, 93.76, 93.06, 91.93, 
93.41, 91.68, 92.98, 93.42, 92.39, 93.74, 92.69, 93.12, 92.57, 
93.49, 92.59, 92.85, 91.74, 91.23, 91.53, 90.08, 90.47, 89.97, 
88.44, 88.66, 87.86, 87.38, 87.42, 87.14, 86.24, 87.67, 86.86, 
87.2, 87.68, 85.93, 86.25, 88.14, 87.71, 88.21, 89.59, 90.38, 
90.76, 91.67, 92.18, 91.79, 93.02, 94.54, 94.04, 94.17, 94.56, 
93.94, 94.29, 93.59, 94.34, 94.79, 94.04, 94.62, 93.51, 92.59, 
94.9, 93.89, 93.19, 94.19, 93.67, 95.19, 94.72, 92.82, 95.49, 
95.13, 94.21, 95.42, 95.34, 94.39, 96.09, 97.14, 100.02, 97.84, 
98.59, 98.72, 102.9, 100.51, 103.23, 100.91, 103.1, 103.21, 103.76, 
102.15, 103.37, 104.98, 104.21, 105.32, 102.65, 104.34, 104.07, 
104.39, 103.62, 104.75, 103.36, 103.8, 104.89, 105.49, 106.69, 
106.91, 104.6, 107.76, 109.36, 109.26, 108.33, 109.12, 109.6, 
110.2, 110.81, 112.57, 110.92, 112.15, 110.86, 111.53, 112.75, 
112.67, 114.3, 113.32, 114.09, 114.65, 112.12, 113.06, 113.27, 
111.34, 114.36, 111.94, 112.04, 109.81, 110.12, 110.98, 111.91, 
112.23, 112.86, 111.23, 111.13, 109.96, 112.59, 110.62, 109.69, 
111.26, 108.05, 110.05, 110.39, 110.92, 110.7, 107.72, 107.26, 
109.22, 108.78, 108.66, 110.62, 108.8, 109.42, 110.12, 111.6, 
110.61, 111, 110.22, 111.69, 112.3, 107.68, 111.92, 112.66, 110.38, 
110.74, 113.16, 111.04, 108.72, 112, 110.35, 110.3, 110.21, 109.04, 
112.63, 109.26, 113.55, 112.07, 111.16, 110.64, 112.98, 111.54, 
114.46, 114.28, 112.29, 111.52, 113.52, 112.84, 112.1, 114.24, 
113.24, 114.18, 114.73, 113.28, 115.9, 114.88, 115.04, 115.72, 
112.57, 115.17, 113.71, 113.82, 115.29, 116.48, 114.36, 116.12, 
111.24, 110.64, 111.49, 109.8, 109.25, 107.21, 100.8, 99.34, 
94.87, 93.66, 92.19, 92.2, 93.49, 95.23, 94.71, 96.27, 97.09, 
96.3, 97.66, 96.56, 97.12, 96.6, 98.78, 98.7, 99.27, 99.03, 99.69, 
98.63, 99.98, 99.7, 100.82, 101.79, 104.09, 105.03, 103.59, 102.21, 
105.56, 101.55, 103.08, 101.93, 101.22, 101.5, 104.35, 102.1, 
101.05, 100.14, 101.87, 100.16, 99.79, 99.16, 100.01, 101.92, 
100.11, 97.66, 97.59, 99.12, 98.02, 98.55, 98.78, 100.31, 100.31, 
99.64, 98.56, 98.37, 98.54, 99.16, 100.35, 99.27, 98.24, 99.95, 
99.43, 99.53, 96.53, 99.06, 100.11, 98.2, 99.17, 97.91, 96.93, 
99.45, 99.02, 99.38, 99.74, 99.38, 100.85, 100.02, 98.66, 100.22, 
101.23, 100.64, 99.94, 100.92, 102.39, 100.8, 99.54, 100.73, 
99.76, 99.07, 99.77, 101.63, 100.4, 99.4, 102.76, 100.97, 100.16, 
101.11, 102.62, 101.82, 103.7, 103.02, 103.59, 103.54, 104.38, 
105.57, 105.52, 105.93, 103.59, 102.87, 103.82, 103.83, 102.5, 
104.23, 104.04, 104.61, 103.38, 104.22, 103.42, 103.7, 104.93, 
105.75, 104.38, 104.29, 105.98, 103.72, 104.07, 103.1, 103.88, 
104.37), start = 1990, frequency = 12)

Pour calculer la série retardée/avancée, il suffit d’utiliser la fonction lag() :

lag(ipi_fr_manuf, k = -1) # série retardée d'un mois : en février 2010 on a la valeur de janvier 2010

La fonction diff permet de calculer la différence entre deux périodes

diff(ipi_fr_manuf, k = 1)

Exercice

Écrire une fonction ev() qui calcule l’évolution mensuelle si la série en entrée est mensuelle, l’évolution trimestrielle si la série en entrée est trimestrielle, etc.
ev <- function(x){
  result <- (x/lag(x, k = -1) - 1) * 100
  return(result)
}
# Ou de manière équivalente :
ev2 <- function(x){
  # Attention ici c'est bien k = 1 dans la fonction diff
  # et k = -1 dans la fonction lag
  result <- (diff(x, k = 1) /lag(x, k = -1)) * 100
  return(result)
}
#################################################
# Remarque : pour des raisons informatiques ces deux fonctions ne donnent pas exactement le même résultat.
# C'est un problème récurrent lorsque l'on souhaite tester l'équalité entre deux séries temporelles :
all (ev(ipi_fr_manuf) == ev2(ipi_fr_manuf))
## [1] FALSE
# Une solution est plutôt d'utiliser la fonction all.equal():
isTRUE(all.equal(ev(ipi_fr_manuf), ev2(ipi_fr_manuf)))
## [1] TRUE

Utilisation de xts et zoo

Utilisation de xts

Un des avantages du package xts est qu’il permet d’appliquer une fonction à chaque période d’une série temporelle (par exemple à toutes les données trimestrielles, annuelles, etc.). Il s’agit des fonctions apply.monthly(), apply.quarterly(), apply.yearly(), etc. Pour cela il faut auparavant convertir les données au format xts.
Par exemple pour calculer la moyenne annuelle :

library(xts)
moy_an <- apply.yearly(as.xts(ipi_fr_manuf), mean)
moy_an
##               [,1]
## déc 1990  94.41167
## déc 1991  93.11250
## déc 1992  91.50667
## déc 1993  87.19083
## déc 1994  91.00250
## déc 1995  94.11167
## déc 1996  94.43833
## déc 1997  99.45333
## déc 1998 103.83917
## déc 1999 106.26667
## déc 2000 111.45667
## déc 2001 112.51000
## déc 2002 111.04250
## déc 2003 109.37833
## déc 2004 110.91000
## déc 2005 111.02750
## déc 2006 112.63083
## déc 2007 114.35333
## déc 2008 110.16833
## déc 2009  95.01917
## déc 2010  99.17583
## déc 2011 103.01750
## déc 2012  99.88167
## déc 2013  99.15500
## déc 2014  98.70917
## déc 2015 100.00000
## déc 2016 100.60167
## déc 2017 103.41333
## déc 2018 103.68417
## oct 2019 104.44700

Exercice

Calculer l’évolution trimestrielle de ipi_fr_manuf.
# Tout d'abord on prolonge l'IPI par des valeurs manquantes jusqu'à la fin de l'année,
# sinon la dernière somme sur le trimestre est fausse.
ipi_fr_manuf_prolonge <- window(ipi_fr_manuf, end = c(2019, 12), extend = TRUE)
somme_trim <- apply.quarterly(as.xts(ipi_fr_manuf_prolonge), sum)
# Attention la fonction lag n'agit pas pareil pour les objets xts et ts :
# il faut ici utiliser l'option k = 1
evol_trim <- (somme_trim/lag(somme_trim, k = 1) - 1) * 100
# On peut utiliser la fonction format() si l'on veut convertir automatiquement en un objet ts
start_year <- as.numeric(format(start(evol_trim), "%Y"))
start_quarter <- as.numeric(substr(quarters(start(evol_trim)), 2, 2))
ts(evol_trim, start = c(start_year, start_quarter), frequency = 4)
##             Qtr1        Qtr2        Qtr3        Qtr4
## 1990          NA -0.54440761 -1.16144426 -0.69582505
## 1991  0.83297583 -1.29409679 -0.11494253  0.26611047
## 1992  0.12911556 -0.71638370 -1.56576954 -1.45140009
## 1993 -1.85212734 -1.17468738  0.35659509 -0.71447675
## 1994  1.61625491  2.52594107  1.81361504  2.16224060
## 1995  0.37997159 -0.15919624  0.43583020 -0.86434997
## 1996  0.09608541  0.82127493 -0.04936878  0.53979678
## 1997  0.92992245  3.07002295  1.91600607  1.69132493
## 1998  0.61189949  1.11283644 -0.07998464 -0.07364478
## 1999 -0.05447321  1.65432336  0.69385309  2.40548752
## 2000  0.60253861  1.63565609  0.07179180  1.54839481
## 2001  0.68880254 -1.05537040 -0.23932634 -1.67930340
## 2002  0.94888092  0.02984006 -0.61153869 -1.25161329
## 2003  0.71732523 -1.71414775  0.30090887  0.66736056
## 2004  1.06130641  0.17452532 -0.30338530  0.56643567
## 2005 -0.25765474 -0.08110056 -0.23147452  0.90394118
## 2006 -0.02986144  1.64286994 -0.86693311  0.54842439
## 2007  0.87564125  0.55823469 -0.21217230 -0.18349693
## 2008  1.00087540 -2.34882847 -2.20710059 -7.01579234
## 2009 -8.66438913  0.07124537  2.54520860  0.85048773
## 2010  0.68153656  1.53846154  0.43771044  1.34428428
## 2011  3.44017730 -1.08407150 -0.99896547  0.56166933
## 2012 -1.58792012 -1.30337227  0.97957273 -2.53939876
## 2013  0.33291436  1.66243440 -1.59528409  1.12024909
## 2014 -0.38824553 -0.83999731  0.79967471 -1.07234100
## 2015  1.30823338  0.70772120 -0.04662781  0.46316351
## 2016  0.40796020 -1.04713771  0.74776339  0.44068920
## 2017  0.25071751  1.53015894  0.96259804  1.76880357
## 2018 -2.12604883  0.09024107  0.47333849 -0.22113258
## 2019  1.19483523 -0.33961785 -0.93633555          NA

Utilisation de zoo

Le package zoo donne un ensemble d’outils qui permettent de manipuler les séries-temporelles. De nombreux packages (dont xts) sont d’ailleurs basés sur ce format. Il permet notamment de faire des imputations de données manquantes selon différentes fonctions (toutes les fonctions commençant par na.) et de mieux gérer le format des dates associées aux séries temporelles (ce qui permet de faire des manipulations avec la fonction format, ce qui permet par exemple plus facilement exporter des séries temporelles sous Excel). Le calcul de l’évolution trimestrielle aurait par exemple pu être faite avec ce package :

somme_trim <- aggregate(as.zoo(ipi_fr_manuf_prolonge), yearqtr, sum)
somme_trim <- as.ts(somme_trim) #La conversion en ts est plus simple depuis un objet zoo
evol_trim <- ev(somme_trim)
evol_trim
##             Qtr1        Qtr2        Qtr3        Qtr4
## 1990             -0.54440761 -1.16144426 -0.69582505
## 1991  0.83297583 -1.29409679 -0.11494253  0.26611047
## 1992  0.12911556 -0.71638370 -1.56576954 -1.45140009
## 1993 -1.85212734 -1.17468738  0.35659509 -0.71447675
## 1994  1.61625491  2.52594107  1.81361504  2.16224060
## 1995  0.37997159 -0.15919624  0.43583020 -0.86434997
## 1996  0.09608541  0.82127493 -0.04936878  0.53979678
## 1997  0.92992245  3.07002295  1.91600607  1.69132493
## 1998  0.61189949  1.11283644 -0.07998464 -0.07364478
## 1999 -0.05447321  1.65432336  0.69385309  2.40548752
## 2000  0.60253861  1.63565609  0.07179180  1.54839481
## 2001  0.68880254 -1.05537040 -0.23932634 -1.67930340
## 2002  0.94888092  0.02984006 -0.61153869 -1.25161329
## 2003  0.71732523 -1.71414775  0.30090887  0.66736056
## 2004  1.06130641  0.17452532 -0.30338530  0.56643567
## 2005 -0.25765474 -0.08110056 -0.23147452  0.90394118
## 2006 -0.02986144  1.64286994 -0.86693311  0.54842439
## 2007  0.87564125  0.55823469 -0.21217230 -0.18349693
## 2008  1.00087540 -2.34882847 -2.20710059 -7.01579234
## 2009 -8.66438913  0.07124537  2.54520860  0.85048773
## 2010  0.68153656  1.53846154  0.43771044  1.34428428
## 2011  3.44017730 -1.08407150 -0.99896547  0.56166933
## 2012 -1.58792012 -1.30337227  0.97957273 -2.53939876
## 2013  0.33291436  1.66243440 -1.59528409  1.12024909
## 2014 -0.38824553 -0.83999731  0.79967471 -1.07234100
## 2015  1.30823338  0.70772120 -0.04662781  0.46316351
## 2016  0.40796020 -1.04713771  0.74776339  0.44068920
## 2017  0.25071751  1.53015894  0.96259804  1.76880357
## 2018 -2.12604883  0.09024107  0.47333849 -0.22113258
## 2019  1.19483523 -0.33961785 -0.93633555          NA

Pour le prochain exercice, utiliser la série suivante :

serie_avec_NA <- ts(c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0, 0, 0, 0, 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 
  NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
  NA, NA, NA, NA, NA, NA, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, 
  NA, NA, NA, NA, NA, NA), start= 2000, frequency = 12)

Exercice

Sur la série serie_avec_NA, utiliser les différentes fonctions du package zoo pour : 1. Enlever les valeurs manquantes au début de la série ; 2. Remplacer les valeurs manquantes à la fin de la série par la dernière valeur observée. 3. Interpoler de manière linéaire les valeurs manquantes entre les 0 et les 1.
Les trois fonctions à utiliser sont : na.trim(), na.locf et na.approx()
# D'abord on enlève les valeurs manquandes au début de la série
etape_1 <- na.trim(serie_avec_NA, sides = "left")
etape_1
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2001   0   0   0   0   0   0   0   0   0   0   0   0
## 2002   0   0   0   0   0   0   0   0   0   0   0   0
## 2003  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
## 2004  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
## 2005   1   1   1   1   1   1   1   1   1   1   1   1
## 2006   1   1   1   1   1   1   1   1   1   1   1   1
## 2007  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
# Ensuite on interpole
etape_2 <- na.approx(etape_1, na.rm = FALSE)
etape_2
##       Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
## 2001 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
## 2002 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
## 2003 0.04 0.08 0.12 0.16 0.20 0.24 0.28 0.32 0.36 0.40 0.44 0.48
## 2004 0.52 0.56 0.60 0.64 0.68 0.72 0.76 0.80 0.84 0.88 0.92 0.96
## 2005 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
## 2006 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
## 2007   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
# Enfin on remplace les valeurs à la fin de la série
etape_3 <- na.locf(etape_2)
etape_3
##       Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
## 2001 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
## 2002 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
## 2003 0.04 0.08 0.12 0.16 0.20 0.24 0.28 0.32 0.36 0.40 0.44 0.48
## 2004 0.52 0.56 0.60 0.64 0.68 0.72 0.76 0.80 0.84 0.88 0.92 0.96
## 2005 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
## 2006 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
## 2007 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00

Exercice

À l’aide des fonctions as.yearmon() et format(), créer un data.frame contenant une colonne “date” qui contient les dates au format JJ/MM/YYYY et une deuxième colonnes avec les valeurs de ipi_fr_manuf.
La fonction as.yearmon() doit être appliquée sur time(ipi_fr_manuf). Pour la fonction format regarder l’aide ?format.Date.
dates <- as.yearmon(time(ipi_fr_manuf))
dates <- format(dates, "%d/%m/%Y")
donnees_formatees <- data.frame(date = dates, ipi = ipi_fr_manuf)
head(donnees_formatees)
##         date   ipi
## 1 01/01/1990 94.20
## 2 01/02/1990 96.69
## 3 01/03/1990 95.66
## 4 01/04/1990 95.06
## 5 01/05/1990 95.96
## 6 01/06/1990 93.97